package com.linx.common.core.enums;

import com.alibaba.fastjson.JSON;
import com.linx.common.core.domain.model.DictEnumBody;
import com.linx.common.core.enums.alarm.AlarmCategoryDictEnum;
import com.linx.common.core.enums.device.CameraTypeEnum;
import com.linx.common.core.enums.meeting_room.MeetTypeEnum;
import lombok.Getter;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;


/**
 * 基础字典
 */
@Getter
public enum BaseDictEnum {

    ALARM_CATEGORY("alarm_category", 1, "告警类别", AlarmCategoryDictEnum.list()),
    CAMERA_TYPE("camera_type", 20, "摄像机类型", CameraTypeEnum.list()),
    MEET_TYPE("meet_type", 30, "会议类型", MeetTypeEnum.list()),
    ;


    private final String code;


    private final Integer sort;

    private final String label;

    private final List<DictEnumBody> subDictList;

    BaseDictEnum(String code, Integer sort, String label, List<DictEnumBody> subDictList) {
        this.code = code;
        this.sort = sort;
        this.label = label;
        this.subDictList = subDictList;
    }

    /**
     *  获取枚举列表
     */
    public static List<DictEnumBody> list() {
        List<DictEnumBody> libEnumVOList = new ArrayList<>();
        Class<BaseDictEnum> enumClass = BaseDictEnum.class;

        try {
            Method getCode = enumClass.getMethod("getCode");
            Method getSort = enumClass.getMethod("getSort");
            Method getLabel = enumClass.getMethod("getLabel");
            Method getSubDictList = enumClass.getMethod("getSubDictList");

            //通过反射取出Enum所有常量的属性值
            for (BaseDictEnum enumConstant: enumClass.getEnumConstants()) {
                String code = (String) getCode.invoke(enumConstant);
                Integer sort = (Integer) getSort.invoke(enumConstant);
                String label = (String) getLabel.invoke(enumConstant);
                List<DictEnumBody> subDictList = JSON.parseArray(JSON.toJSONString(getSubDictList.invoke(enumConstant)), DictEnumBody.class);

                libEnumVOList.add(new DictEnumBody(code, sort, label, subDictList));
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        return libEnumVOList;
    }

    /**
     * 根据code获取label
     */
    public static String getLabelByCode(String code) {
        for (BaseDictEnum item: BaseDictEnum.values()) {
            if (item.getCode().equals(code)) {
                return item.getLabel();
            }
        }

        return null;
    }

}
